home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 January: Mac OS SDK / Dev.CD Jan 99 SDK1.toast / Development Kits / Mac OS USB DDK_v1.0.1 / Examples / MouseModule / HIDEmulation.c next >
Encoding:
C/C++ Source or Header  |  1998-09-03  |  5.0 KB  |  191 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        HIDEmulation.c
  3.  
  4.     Contains:    HID Emulation glue code between the ADB SHIM and the USB Mouse HID Module
  5.  
  6.     Version:    xxx put version here xxx
  7.  
  8.     Copyright:    © 1998 by Apple Computer, Inc., all rights reserved.
  9.  
  10. */
  11.  
  12. #include <Types.h>
  13. #include <Devices.h>
  14. #include <DriverServices.h>
  15. #include <CursorDevices.h>
  16. #include <USB.h>
  17.  
  18.  
  19. #include "MouseModule.h"
  20.  
  21. extern    usbMousePBStruct myMousePB;
  22.  
  23. void USBMouseIn(UInt32 refcon, void * theData)
  24. {
  25. #pragma unused (refcon)
  26.  
  27. USBHIDDataPtr    pMouseData;
  28. static UInt16     oldbuttons = 0;
  29. UInt16     changedbuttons = 0;
  30.  
  31. //    DebugStr("\pIn USBMouseIn");
  32.     pMouseData = (USBHIDDataPtr)theData;
  33.  
  34.     // Tell the Cursor Device Manager that we moved
  35.     if ((pMouseData->mouse.XDelta != 0) || (pMouseData->mouse.YDelta !=0))
  36.     {
  37.         CursorDeviceMove(myMousePB.pCursorDeviceInfo, pMouseData->mouse.XDelta, pMouseData->mouse.YDelta);
  38.     }
  39.     
  40.     // Update with the state of the buttons.
  41.     pMouseData->mouse.buttons &= 0x07;
  42.     changedbuttons = oldbuttons ^ pMouseData->mouse.buttons;
  43.     if (changedbuttons)
  44.     {
  45.         CursorDeviceButtons(myMousePB.pCursorDeviceInfo, (short)pMouseData->mouse.buttons);
  46.     }
  47.     oldbuttons = pMouseData->mouse.buttons;
  48. }
  49.  
  50. OSStatus USBHIDInstallInterrupt(HIDInterruptProcPtr HIDInterruptFunction, UInt32 refcon)
  51. {
  52.     USBExpertStatus(myMousePB.deviceRef, "\pUSBHIDMouseModule: Demo Mode Disabled (interrupt service routine installed)", myMousePB.deviceRef);
  53.     myMousePB.interruptRefcon = refcon;
  54.     myMousePB.pSHIMInterruptRoutine = HIDInterruptFunction;
  55.     return noErr;
  56. }
  57.  
  58. OSStatus USBHIDPollDevice(void)
  59. {
  60.     return kUSBInternalErr;
  61. }
  62.  
  63. OSStatus USBHIDControlDevice(UInt32 theControlSelector, void * theControlData)
  64. {
  65. #pragma unused (theControlData)
  66.  
  67.     switch (theControlSelector)
  68.     {
  69.         case kHIDRemoveInterruptHandler:
  70.             myMousePB.interruptRefcon = nil;
  71.             myMousePB.pSavedInterruptRoutine = nil;
  72.             myMousePB.pSHIMInterruptRoutine = nil;
  73.             break;
  74.             
  75.         case kHIDEnableDemoMode:
  76.             USBExpertStatus(myMousePB.deviceRef, "\pUSBHIDMouseModule: Demo Mode Enabled", myMousePB.deviceRef);
  77.             
  78.             if (myMousePB.pCursorDeviceInfo == 0)
  79.             {
  80.                 myMousePB.pCursorDeviceInfo = &myMousePB.cursorDeviceInfo;
  81.                 CursorDeviceNewDevice(&myMousePB.pCursorDeviceInfo);
  82.                 
  83.                 CursorDeviceSetAcceleration(myMousePB.pCursorDeviceInfo, (Fixed)(1<<16));
  84.                 
  85.                 CursorDeviceSetButtons(myMousePB.pCursorDeviceInfo, 3);            // should actually be set by reading
  86.                                                                                 // the HID descriptor, but lacking
  87.                                                                                 // a parser, we'll just force it
  88.                                                                                 // this way.
  89.                 CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 0, kButtonSingleClick, 0L);
  90.                 CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 1, kButtonSingleClick, 0L);
  91.                 CursorDeviceButtonOp(myMousePB.pCursorDeviceInfo, 2, kButtonSingleClick, 0L);
  92.                 CursorDeviceUnitsPerInch(myMousePB.pCursorDeviceInfo, (Fixed)(myMousePB.unitsPerInch));
  93.             }
  94.         
  95.             myMousePB.pSavedInterruptRoutine = myMousePB.pSHIMInterruptRoutine;
  96.             myMousePB.pSHIMInterruptRoutine = USBMouseIn;
  97.             break;
  98.  
  99.         case kHIDDisableDemoMode:
  100.             USBExpertStatus(myMousePB.deviceRef, "\pUSBHIDMouseModule: Demo Mode Disabled", myMousePB.deviceRef);
  101.             if (myMousePB.pCursorDeviceInfo != 0)
  102.             {
  103.                 CursorDeviceDisposeDevice(myMousePB.pCursorDeviceInfo);
  104.                 myMousePB.pCursorDeviceInfo = 0;
  105.             }
  106.             myMousePB.pSHIMInterruptRoutine = myMousePB.pSavedInterruptRoutine;
  107.             break;
  108.  
  109.         default:
  110.             return paramErr;
  111.     }
  112.     return noErr;
  113. }
  114.  
  115.  
  116.  
  117. OSStatus USBHIDGetDeviceInfo(UInt32 theInfoSelector, void * theInfo)
  118. {
  119. HIDInterruptProcPtr * pHIDIntProcPtr;
  120. UInt32 * pUnits;
  121. UInt32 * pInterruptRefcon;
  122.  
  123.     switch (theInfoSelector)
  124.     {
  125.         case kHIDGetDeviceUnitsPerInch:
  126.             pUnits = (UInt32*)theInfo;
  127.             *pUnits = (UInt32)(myMousePB.unitsPerInch);
  128.             break;
  129.             
  130.             
  131.         case kHIDGetInterruptHandler:
  132.             pHIDIntProcPtr = (HIDInterruptProcPtr *)theInfo;     
  133.             *pHIDIntProcPtr = myMousePB.pSHIMInterruptRoutine;
  134.             break;
  135.  
  136.         case kHIDGetInterruptRefcon:
  137.             pInterruptRefcon = (UInt32 *)theInfo;
  138.             *pInterruptRefcon = myMousePB.interruptRefcon;
  139.             break;
  140.         
  141.         default:
  142.             return paramErr;
  143.     }
  144.     return noErr;
  145. }
  146.  
  147. OSStatus USBHIDEnterPolledMode(void)
  148. {
  149.     return unimpErr;
  150. }
  151.  
  152. OSStatus USBHIDExitPolledMode(void)
  153. {
  154.     return unimpErr;
  155. }
  156.  
  157. void NotifyRegisteredHIDUser(UInt32 devicetype, UInt8 hidReport[])
  158. {
  159. #pragma unused (devicetype)
  160.  
  161. USBHIDData        theMouseData;
  162. SInt8            myXDelta, myYDelta;
  163.  
  164.     theMouseData.mouse.buttons = (UInt16)hidReport[0];
  165.     
  166.     myXDelta = (SInt8)hidReport[1];
  167.     myYDelta = (SInt8)hidReport[2];  
  168.     
  169.     theMouseData.mouse.XDelta = (SInt16)myXDelta;
  170.     theMouseData.mouse.YDelta = (SInt16)myYDelta;
  171.     if (myMousePB.pSHIMInterruptRoutine)
  172.     {
  173.         (*myMousePB.pSHIMInterruptRoutine)(myMousePB.interruptRefcon, (void *)&theMouseData);
  174.     }
  175. }
  176.  
  177. USBHIDModuleDispatchTable TheHIDModuleDispatchTable =
  178. {
  179.     (UInt32)0,
  180.     (USBHIDInstallInterruptProcPtr)USBHIDInstallInterrupt,
  181.     (USBHIDPollDeviceProcPtr)USBHIDPollDevice,
  182.     (USBHIDControlDeviceProcPtr)USBHIDControlDevice,
  183.     (USBHIDGetDeviceInfoProcPtr)USBHIDGetDeviceInfo,
  184.     (USBHIDEnterPolledModeProcPtr)USBHIDEnterPolledMode,
  185.     (USBHIDExitPolledModeProcPtr)USBHIDExitPolledMode
  186. };
  187.  
  188. CursorDevicePtr gUSBMouse;
  189. CursorDevice    ourDevice;
  190.  
  191.